/* 
 * @(#)ContenidoBean.java 
 *  
 * Esta clase presenta la informacion de un animal especifico.  
 * 
 * @version 1.0
 * @date 01/11/12 
 * @author Ricardo Escobar 
 *  
 */
package muhnes.sizoo.publico;

import java.util.List;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.map.LatLng;  
import org.primefaces.model.map.MapModel;  
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.DefaultMapModel;
import muhnes.sizoo.dal.*;
import muhnes.sizoo.modelo.Resenya;
import muhnes.sizoo.modelo.Animal;
import muhnes.sizoo.modelo.Sinonimia;
import muhnes.sizoo.modelo.Especimen;
import muhnes.sizoo.modelo.Acuatico;
import muhnes.sizoo.modelo.Terrestre;
import muhnes.sizoo.modelo.Recoleccion;
import muhnes.sizoo.modelo.Nacional;
import muhnes.sizoo.modelo.Internacional;
import muhnes.sizoo.modelo.Municipio;
import muhnes.sizoo.util.TipoEspecimen;
import muhnes.sizoo.util.TipoRecoleccion;  
import org.apache.commons.lang3.StringUtils;
import org.primefaces.event.map.OverlaySelectEvent;

/**
 * Clase que contiene los metodos que controlan la vista de informacion de los animales
 */
@ManagedBean(name = "contenidoBean")
@ViewScoped
public class ContenidoBean implements Serializable{
    
    private Animal animal;
    private Especimen especimen;
    private Resenya resenya;
    private MapModel mapa; 
    private int codigoAnimal;
    private TipoEspecimen tipoEspecimen;
    private TipoRecoleccion tipoRecoleccion;
    private List<Especimen> listaEspecimenes;
    private String aux;
   int i;
   
   /**
    * Constructor de la clase
    */
    public ContenidoBean(){
        mapa = new DefaultMapModel(); 
        i= 0;
    }
    
    /**
     * Getter de animal
     *  
     */
    public Animal getAnimal() {
        if(animal == null){
            AnimalDao animalDao = FabricaDAO.crearAnimalDao();
            animal = animalDao.buscarPorId(codigoAnimal);
        }
        return animal;
    }

    /**
     * Metodo que presenta la reseña del animal
     */ 
    public Resenya getResenya() {
        if(resenya == null){
            ResenyaDao resenyaDao = FabricaDAO.crearResenyaDao();
            resenya = resenyaDao.buscarPorAnimal(codigoAnimal);
        }
        return resenya;
    }
    
    
    /**
     * Metodo que presenta las sinonimias
     */
    public String getSinonimias() {
        String sinonimias = "";
        for( Sinonimia sinonimia : animal.getSinonimias() ) {
            String nombreAntiguo = sinonimia.getNombreantiguo();
            sinonimias += ", " + nombreAntiguo;
        }      
        if( !sinonimias.isEmpty() ) {
            sinonimias = sinonimias.substring(2);
        }
        else {
            sinonimias = "-";
        }
        return sinonimias;
    }

    /**
     * Getter de codigoAnimal
     *  
     */
    public int getCodigoAnimal() {
        return codigoAnimal;
    }
    
    /**
     * Setter de codigoAnimal
     * 
     */
    public void setCodigoAnimal(int codigoAnimal) {
        this.codigoAnimal = codigoAnimal;
    }
    
    /**
     * Getter del mapa
     *  
     */
    public MapModel getMapa() {
        return mapa;
    }
    
    /** 
     * Metodo que presenta el mapa y ubicaciones de los especimenes
     * 
     */
    public MapModel coordenadasMapa(){
        AnimalDao animalDao = FabricaDAO.crearAnimalDao();
        List<Municipio> listaCoordenadas = 
                animalDao.buscarMunicipiosAsociados(animal);  
        for(Municipio municipio: listaCoordenadas)
        {          
            List<Especimen> especimenes = animalDao.buscarFoto(animal, municipio);
            int indice = (int)(Math.random() * ( especimenes.size() - 1 ));
            this.aux = especimenes.get( indice ).getCodigoespecimen();
            
            mapa.addOverlay(
                    new Marker(new LatLng(municipio.getLatitud().doubleValue(), 
                    municipio.getLongitud().doubleValue()), 
                    municipio.getNombre(), this.aux ));
        }
        return mapa;
    }
    
    private Marker marcador;
    
    /**
     * Getter de marcador
     *  
     */
    public Marker getMarcador(){
        return marcador;
    }
    
    /**
     * Metodo que seleciona el marcador
     * @param evento 
     */
    public void seleccionarMarcador(OverlaySelectEvent evento) {  
        marcador = (Marker) evento.getOverlay();  
    }
     
    /**
     * Metodo que presenta la lista de especimenes 
     */
    public List< Especimen > getListaEspecimenes() {
        if( listaEspecimenes == null) {
            EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
            listaEspecimenes = especimenDao.buscarPorAnimal(animal);
        }
        return listaEspecimenes;
    }
    
    /** 
     * Especimenes acuaticos o terrestres 
     */
    public TipoEspecimen getTipoEspecimen(){
        return tipoEspecimen;
    }
    
    /**
     * Convierte un especimen acuatico
     * 
     */
    public Acuatico castAcuatico(Especimen especimen) {
        return (Acuatico)especimen;
    }
    
    /**
     * Convierte un especimen terrestre
     * 
     */
    public Terrestre castTerrestre(Especimen especimen) {
        return (Terrestre)especimen;
    }

    /**
     * Getter de especimen
     *  
     */
    public Especimen getEspecimen() {
        return especimen;
    }
    
    /**
     * Metodo que presenta las coordenadas del municipio 
     */
    public Municipio coordenadasEspecimen(String codigoEspecimen){
        EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
        Especimen e = especimenDao.buscarPorId( codigoEspecimen );
        Municipio municipio = especimenDao.buscarMunicipiosAsociados(e);
        return municipio;
    }
   
    /**
     * Metodo que presenta las recolecciones internacionales
     */ 
     public Internacional recoleccionInternacional(String codigoEspecimen){
        EspecimenDao especimenDao = FabricaDAO.crearEspecimenDao();
        Especimen e = especimenDao.buscarPorId( codigoEspecimen );
        Internacional internacional = especimenDao.buscarRecoleccionInternacional(e);
        return internacional;
    }
    
    /**
     * Getter de tipo de recoleccion
     *  
     */
    public TipoRecoleccion getTipoRecoleccion() {
        return tipoRecoleccion;
    }
    
    /**
     * Convierte una recoleccion nacional
     * 
     */
    public Nacional castNacional(Recoleccion recoleccion) {
        return (Nacional)recoleccion;
    }
    
    /**
     * Convierte una recoleccion internacional
     * 
     */
    public Internacional castInternacional(Recoleccion recoleccion) {
        return (Internacional)recoleccion;
    }

    /**
     * getter de aux
     *  
     */
    public String getAux() {
        return aux;
    }

    /**
     * Setter de aux
     * 
     */
    public void setAux(String aux) {
        this.aux = aux;
    }
        
}
